import IPropDTO from "./IPropDTO";
import IPropManage from "./IPropManage";
import IPropPO from "./IPropPO";
import IPropVO from "./IPropVO";

/*****************************
 *@file: PropManageSingleton
 *@author: 陈吕唐
 *@desc: 道具管理单例(背包系统)
 *@date: 2024-03-01	14:01
 *****************************/
export default class PropManageSingleton implements IPropManage {

    /****************************************************************************************************************
     *Readonly 常量
     ****************************************************************************************************************/
    protected static _single = undefined!;
    /****************************************************************************************************************
     *Property 定义变量
     ****************************************************************************************************************/
    /**
     * 道具配置数据
     */
    protected poMap: Map<number, IPropPO> = new Map<number, IPropPO>();


    protected map: Map<number, IPropVO> = new Map<number, IPropVO>();
    /***************************************************************
     *PropertyUI 引用的控件
     ***************************************************************/
    /****************************************************************************************************************
     * Lifecycle 生命周期相关方法
     ****************************************************************************************************************/
    /****************************************************************************************************************
     * Public 公有方法
     ****************************************************************************************************************/
    /**
     * 初始化物品表配置数据
     * @param array 
     */
    public initPO(array: IPropPO[] = []) {
        this.poMap.clear();
        array.forEach((item) => {
            this.poMap.set(item.id, item);
        });
    }

    /**
     * 初始化道具数据
     * @param array 
     */
    public initVO(array: IPropDTO[] = []) {
        this.map.clear();
        array.forEach((item) => {
            let vo = this.createPropVO(item);
            this.map.set(item.id, vo);
        });
    }

    /**
     * 根据后端用户道具数据更新道具数据
     * @param value 用户道具数据
     */
    public updateProp(value: IPropDTO) {
        let vo = this.map.get(value.id);

        if (!vo) {
            vo = this.createPropVO(value);
            this.map.set(value.id, vo);
        }

        vo.number = value.number;
    }

    public getPropVO(id: number): IPropVO {
        return this.map.get(id);
    }

    public getPropPO(id: number): IPropPO {
        return this.poMap.get(id);
    }
    /****************************************************************************************************************
     * private 私有方法
     ****************************************************************************************************************/
    /**
     * 创建道具数据
     * @param dto 
     * @returns 
     */
    protected createPropVO(dto: IPropDTO): IPropVO {
        let po = this.poMap.get(dto.id);
        if (!po) {
            console.error(`创建道具失败,道具id:${dto.id}`);
            return undefined!;
        }

        let vo: IPropVO = { ...dto, ...po }
        return vo;
    }
    /****************************************************************************************************************
     * Property Get && Set 属性的 get && set 函数
     ****************************************************************************************************************/
    public static get single() {
        return PropManageSingleton._single;
    }
}